Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 <<   zurück
Visual Basic 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual Basic 2005

Visual Basic 2005
1.233 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-585-1
gp Kapitel 6 Vererbung, Polymorphie und Schnittstellen
  gp 6.1 Basisklassen und abgeleitete Klassen
    gp 6.1.1 Die Ableitung einer Klasse
    gp 6.1.2 Klassen, die nicht vererben können
    gp 6.1.3 Zusammenfassung
  gp 6.2 Konstruktoren in abgeleiteten Klassen
    gp 6.2.1 Allgemeines
    gp 6.2.2 Die Konstruktoren der Klasse »GraphicCircle«
    gp 6.2.3 Der Zugriffsmodifizierer »Protected«
    gp 6.2.4 Konstruktorverkettung
    gp 6.2.5 Finalizer-Verkettung
    gp 6.2.6 Zusammenfassung
    gp 6.2.7 Der Stand des Projekts »CircleApplication«
  gp 6.3 Die Methoden in einer abgeleiteten Klasse
    gp 6.3.1 Geerbte Methoden mit »Shadows« verdecken
    gp 6.3.2 Überladen einer Basisklassenmethode
  gp 6.4 Ereignisse in der Vererbung
  gp 6.5 »Hat-eine«-Beziehungen (Aggregation)
    gp 6.5.1 Weiterleitung einer internen Objektreferenz
    gp 6.5.2 Verbergen des internen Objekts
    gp 6.5.3 Innere Klassen
  gp 6.6 Typumwandlung von Objektvariablen
    gp 6.6.1 Die implizite Typumwandlung von Objektreferenzen
    gp 6.6.2 Die explizite Typumwandlung von Objektreferenzen
    gp 6.6.3 Zusammenfassung
  gp 6.7 Abstrakte Klassen und Methoden
    gp 6.7.1 Problembeschreibung
    gp 6.7.2 Abstrakte Definitionen
  gp 6.8 Polymorphie
    gp 6.8.1 Überschreibbare Methoden mit »Overridable«
    gp 6.8.2 Inhomogene Mengen
    gp 6.8.3 Verdecken und Überschreiben geerbter Methoden
    gp 6.8.4 Überschreiben der Methode »ToString()« der Klasse »Object«
    gp 6.8.5 Nicht überschreibbare Methoden
    gp 6.8.6 Die Referenzen »Me«, »MyBase« und »MyClass«
    gp 6.8.7 Zusammenfassung
  gp 6.9 Erweiterung der Klassenhierarchie »CircleApplication«
    gp 6.9.1 Die Klasse »GeometricObject«
  gp 6.10 Schnittstellen
    gp 6.10.1 Einführung in die Schnittstellen
    gp 6.10.2 Schnittstellendefinition
    gp 6.10.3 Schnittstellenimplementierung
    gp 6.10.4 Abstrakte Klassen vs. Schnittstellen
    gp 6.10.5 Zusammenfassung


Galileo Computing

6.5 »Hat-eine«-Beziehungen (Aggregation)  downtop

Stellen Sie sich vor, Sie müssten die Klasse eines Motorflugzeugs modellieren. Eine Klasse Flugzeug könnte die Zustandsdaten bereitstellen, beispielsweise spannweite, anzahlDerSitzplaetze und minGeschwindigkeit, die in einem Konstruktor initialisiert werden. Die Implementierung der Klasse könnte wie folgt lauten:


Class Flugzeug
Private spannweite As Single
Private anzahlDerSitzplaetze As Integer
Private minGeschwindigkeit As Single
Public Sub New(ByVal spannweite As Single, _
ByVal sitzplaetze As Integer, _
ByVal minGeschwindigkeit As Single)
Me.spannweite = spannweite
Me.anzahlDerSitzplaetze = sitzplaetze
Me.minGeschwindigkeit = minGeschwindigkeit
End Sub
' weiterer Klassencode
End Class

Da es sich um die Beschreibung eines Motorflugzeugs handelt, sollten wir auch noch eine Klasse Triebwerk entwickeln. Die Objektdaten werden im Konstruktor initialisiert, außerdem enthält der Entwurf zwei Methoden, mit denen das Triebwerk angelassen und abgeschaltet werden kann.


Class Triebwerk
Private leistung As Integer
Private gewicht As Single
Public Sub New(ByVal leistung As Integer, _
ByVal gewicht As Single)
Me.leistung = leistung
Me.gewicht = gewicht
End Sub
' das Triebwerk starten
Public Sub Starten()
Console.WriteLine("Das Triebwerk wird gestartet")
End Sub
' das Triebwerk ausschalten
Public Sub Ausschalten()
Console.WriteLine("Das Triebwerk wird abgeschaltet")
End Sub
' weiterer Klassencode
End Class

In der realen Welt stehen Objekte dieser beiden Klassen miteinander in einer Beziehung, die nicht durch eine Vererbungslinie abgebildet werden kann. Denken Sie daran, dass die Implementierungsvererbung eine Beziehung zwischen Typen beschreibt, die als Ist-eine-Beziehung bezeichnet wird. Dass ein Flugzeug aber kein Triebwerk ist oder umgekehrt ein Triebwerk kein Flugzeug, leuchtet ein.

Um die beiden miteinander in einer unzertrennlichen Beziehung stehenden Typen Flugzeug und Triebwerk zu beschreiben, müsste man sagen, dass ein Flugzeug ein Triebwerk hat. Der vorliegende Sachverhalt einer Hat-eine-Beziehung – auch als Aggregation bezeichnet – wird auch im objektorientierten Sprachgebrauch zum Ausdruck gebracht. Ein Flugzeug hat ein Triebwerk, folgerichtig muss die Klassendefinition Flugzeug eine Instanzvariable vom Typ Triebwerk enthalten. Die Klasse Flugzeug kann mit dieser Überlegung folgendermaßen verbessert werden:


Class Flugzeug
Private myMotor As Triebwerk
...
End Class

In der übergeordneten Klasse Flugzeug ist ein untergeordnetes Objekt vom Typ Triebwerk Private deklariert. Diese Kapselung entspricht den Paradigmen der objektorientierten Programmierung, wirft jedoch auch sofort die Frage auf, wie ein Objekt vom Typ Triebwerk instanziiert und später gestartet bzw. ausgeschaltet werden kann.

Um bei der Instanziierung eines Flugzeugobjekts sofort eine gültige Referenz auf ein Triebwerksobjekt zu erhalten, eignet sich der Konstruktor der Klasse Flugzeug, in dem die Klasse Triebwerk instanziiert und mit den notwendigen Initialisierungsdaten versorgt wird:


Class Flugzeug
Private myMotor As Triebwerk
...
' aktualisierter Konstruktor der Klasse Flugzeug
Public Sub New(ByVal spannweite As Single, _
ByVal sitzplaetze As Integer, _
ByVal minGeschwindigkeit As Single, _
ByVal leistung As Integer, _
ByVal gewicht As Single)
Me.spannweite = spannweite
Me.anzahlDerSitzplaetze = sitzplaetze
Me.minGeschwindigkeit = minGeschwindigkeit
myMotor = New Triebwerk(leistung, gewicht)
End Sub
' weiterer Klassencode
End Class

Nun beschreibt ein Objekt vom Typ Flugzeug ein ganz bestimmtes Objekt vom Typ Triebwerk – das Triebwerk ist dem Flugzeug eindeutig zugeordnet. Was bleibt, sind das Starten und Ausschalten des Triebwerks. Dazu bieten sich zwei Alternativen an:

1. Die Definition einer Eigenschaft, welche die Referenz auf das Triebwerk zurückliefert. Auf diese Referenz können anschließend die triebwerksspezifischen Methoden Starten und Ausschalten aufgerufen werden.
       
2. Die Definition einer Methode in der Klasse Flugzeug, die den Methodenaufruf an das untergeordnete Triebwerksobjekt weiterleitet.
       

Galileo Computing

6.5.1 Weiterleitung einer internen Objektreferenz  downtop

Sehen wir uns zuerst die Realisierung mittels einer Eigenschaft an, welche die in der privaten Variablen myMotor des Flugzeugobjekts enthaltene Referenz eines Triebwerksobjekt dem Aufrufer zur Verfügung stellt. Auf den Set-Accessor kann verzichtet werden, weil das Triebwerksobjekt bereits im Konstruktor erzeugt wird:


Class Flugzeug
Private myMotor As Triebwerk
Public ReadOnly Property Motor() As Triebwerk
Get
Return myMotor
End Get
End Property
' weiterer Klassencode
End Class

Der Benutzer besorgt sich nach der Instanziierung der Klasse Flugzeug die Referenz auf das interne Triebwerksobjekt und kann darauf die beiden Methoden Anlassen und Ausschalten aufrufen:


Dim myCessna As Flugzeug = New Flugzeug(8, 4, 80, 150, 300)
myCessna.Motor.Starten()
...
myCessna.Motor.Ausschalten()

Der Teilausdruck


myCessna.Motor

liefert die Referenz auf das Triebwerk, über die mit der üblichen Punktnotation auf alle Klassenmitglieder des internen Objekts zugegriffen werden kann. Festzustellen ist, dass dem Aufrufer nicht verborgen bleibt, dass ein zweites, internes Objekt der übergeordneten Klasse seine Dienste bereitstellt.


Galileo Computing

6.5.2 Verbergen des internen Objekts  downtop

Betrachten wir nun die zweite Alternative. In der Klasse Flugzeug sind dazu zwei Methoden definiert: die erste, um das Triebwerk einzuschalten, die zweite, um es wieder auszuschalten. Der Aufruf wird in den Methoden an das interne Triebwerksobjekt weitergeleitet.


Class Flugzeug
Private myMotor As Triebwerk
Public Sub MotorStarten()
myMotor.Starten()
End Sub
Public Sub MotorAusschalten()
myMotor.Ausschalten()
End Sub
' weiterer Klassencode
End Class

Der Aufruf einer der beiden Instanzmethoden MotorStarten oder MotorAusschalten des Flugzeug-Objekts bewirkt, dass das Triebwerk das gewünschte Verhalten zeigt: Es wird angelassen oder abgeschaltet. Im Gegensatz zur Weiterleitung der internen Objektreferenz bemerkt der Aufrufer nicht, dass das Flugzeug-Objekt sich hinterlistig der Funktionalität einer zweiten Klasse bedient. Setzen wir voraus, dass die Codeimplementierung der beiden Methoden in der untergeordneten Klasse Triebwerk möglicherweise sehr komplex ist, gaukelt diese Lösung dem Aufrufer Intelligenz vor und verbirgt dabei den tatsächlichen Dienstanbieter – ganz im Gegensatz zu der zuerst vorgestellten Variante, bei der die Referenz des Triebwerk-Objekts dem Aufrufer bekannt ist.

Fassen wir an dieser Stelle den Programmcode, der die beiden Möglichkeiten der Implementierung einer Hat-eine-Beziehung beschreibt, zusammen. Die Klasse Flugzeug im folgenden Beispiel bietet Alternativen an, die in der Main-Methode auch beide benutzt werden. Dabei bedient sich das Objekt myCessna der weitergeleiteten Triebwerksreferenz, das Objekt myPiper hingegen ruft die Methoden MotorStarten und MotorAusschalten auf, ohne direkt das interne Objekt vom Typ Triebwerk anzusprechen.


' ------------------------------------------------------------
' Beispiel: ...\Kapitel 6\HatEineBeziehung
' ------------------------------------------------------------
Module Module1
Sub Main()
Dim myCessna As Flugzeug = New Flugzeug(8, 4, 80, 150, 300)
Console.WriteLine("Der Typ Cessna:")
myCessna.Motor.Starten()
myCessna.Motor.Ausschalten()
Console.WriteLine("------------------------------")
Dim myPiper As Flugzeug = New Flugzeug(9, 3, 75, 180, 250)
Console.WriteLine("Der Typ Piper:")
myPiper.MotorStarten()
myPiper.MotorAusschalten()
Console.ReadLine()
End Sub
End Module
' --------- Klasse 'Flugzeug' -------------
Class Flugzeug
Private myMotor As Triebwerk
Private spannweite As Single
Private anzahlDerSitzplaetze As Integer
Private minGeschwindigkeit As Single
Public Sub New(ByVal spannweite As Single, _
ByVal sitzplaetze As Integer, _
ByVal minGeschwindigkeit As Single, _
ByVal leistung As Integer, _
ByVal gewicht As Single)
Me.spannweite = spannweite
Me.anzahlDerSitzplaetze = sitzplaetze
Me.minGeschwindigkeit = minGeschwindigkeit
myMotor = New Triebwerk(leistung, gewicht)
End Sub
Public Sub MotorStarten()
myMotor.Starten()
End Sub
Public Sub MotorAusschalten()
myMotor.Ausschalten()
End Sub
Public ReadOnly Property Motor() As Triebwerk
Get
Return myMotor
End Get
End Property
End Class
' --------- Klasse 'Triebwerk' -----------------
Class Triebwerk
Private leistung As Integer
Private gewicht As Single
Public Sub New(ByVal leistung As Integer, ByVal gewicht As Single)
Me.leistung = leistung
Me.gewicht = gewicht
End Sub
' das Triebwerk starten
Public Sub Starten()
Console.WriteLine("Das Triebwerk wird gestartet")
End Sub
' das Triebwerk ausschalten
Public Sub Ausschalten()
Console.WriteLine("Das Triebwerk wird abgeschaltet")
End Sub
End Class


Galileo Computing

6.5.3 Innere Klassen  toptop

Es gibt noch eine andere Möglichkeit, Hat-eine-Beziehungen zu realisieren. Dazu wird im Gültigkeitsbereich einer Klasse eine weitere Klasse definiert:


Public Class ClassA
Public Class ClassB
' weiterer Code der Klasse ClassB
End Class
' weiterer Code der Klasse ClassA
End Class

Eine Klasse, die innerhalb einer anderen Klasse definiert ist, wird als innere Klasse bezeichnet. Im Codefragment ist das die Definition der Klasse ClassB in ClassA. Die Verwendung innerer Klassen ist eine bequeme Möglichkeit zur Bereitstellung untergeordneter Objekte und wird benutzt, wenn ein Typ einem anderen Typ logisch zugeordnet werden kann.

Rufen Sie sich noch einmal das Beispiel des Flugzeugs und des Triebwerks in Erinnerung, deren Klassen wir weiter oben folgendermaßen definiert hatten:


Class Flugzeug
End Class
Class Triebwerk
End Class

Ein Triebwerk ist Bauteilkomponente eines Flugzeugs. Wenn kein Zwang dazu besteht, ein Triebwerk auch als separates Objekt einer Betrachtung zu unterziehen, wäre es überlegenswert, die Definition Triebwerk in der Definition Flugzeug einzuschließen:


Public Class Flugzeug
Public Class Triebwerk
' Anweisungen
End Class
End Class

Ein Objekt vom Typ Triebwerk ist jetzt abhängig von einem Objekt des Typs Flugzeug und kann nur im Kontext der äußeren Klasse, also von Flugzeug, benutzt werden.

Ist die innere Klasse Public deklariert, muss bei der Instanziierung immer der Typ der äußeren Klasse angegeben werden.


Dim turbine As Flugzeug.Triebwerk = _
New Flugzeug.Triebwerk(545, 320)

Die eindeutige Zugehörigkeit eines Triebwerk-Objekts zu einem Flugzeug zeigt sich erst, wenn das Flugzeug-Objekt ein ihm zugeordnetes Triebwerk hat. Dazu wird im Konstruktor der äußeren Klasse die innere Klasse instanziiert und die Referenz in einer gekapselten Variablen vorgehalten.


Public Class Flugzeug
Private turbine As Triebwerk
Public Sub New()
turbine = New Triebwerk()
' Anweisungen
End Sub
Public Class Triebwerk
' Anweisungen
End Class
End Class

Festhalten können wir, dass sich im Vergleich zu zwei separaten Klassendefinitionen, wie wir sie anfangs hatten, nicht wesentlich viel geändert. Interessant wird es, wenn die innere Klasse Private deklariert wird:


Public Class Flugzeug
...
Private Class Triebwerk
' Anweisungen
End Class
End Class

Die Klasse Triebwerk ist nun ein eindeutig einem Flugzeugobjekt zugeordnetes Element. Kein anderer Code, außer der in der äußeren Klasse, hat Zugriff auf den inneren Typ.

Doch wie kann ein Aufrufer ein Triebwerk starten, wenn der Typ Triebwerk für ihn völlig unsichtbar bleibt und er deshalb nicht die klassenspezifischen Methoden aufrufen kann? Die Lösung führt wieder über Methoden, die in der äußeren Klasse Flugzeug definiert sind:


Public Class Flugzeug
Private turbine As Triebwerk
Public Sub TurbineStarten()
turbine.Starten()
End Sub
...
' innere Klasse
Private Class Triebwerk
' das Triebwerk starten
Public Sub Starten()
Console.WriteLine("Das Triebwerk wird gestartet")
End Sub
...
End Class
End Class

Weil die Klasse Triebwerk Private deklariert ist, hat sie eine Sichtbarkeit wie jede andere private Entität der äußeren Flugzeug-Klasse. Ein Flugzeug-Objekt kann deshalb auch die innere, private Klasse instanziieren. Der resultierende Verweis wird in der Methode TurbineStarten zum Aufruf der Methode Starten benutzt. Obwohl der Aufrufer nichts von der Existenz der Klasse Triebwerk weiß, wird er Nutzen aus dieser Klasse ziehen können und die Reaktion auf den Aufruf zu spüren bekommen – und sei es nur die Ausgabe im Konsolenfenster.

Die gegenseitige Abhängigkeit von äußerer und innerer Klasse

Wir wollen nun unsere Überlegungen hinsichtlich der Abhängigkeit der beiden Klassen Flugzeug und Triebwerk auf die Spitze treiben. Wenn wir es ganz streng sehen, müssen wir feststellen, dass ein Flugzeug ein Triebwerk besitzt und ein Triebwerk auch in einem ganz bestimmten Flugzeug eingebaut ist. Woher weiß das Triebwerk, in welchem Flugzeug es eingebaut ist? Es hat keine Information darüber, die diese Zuordnung beschreibt.

Um den Kreis zu schließen und Eindeutigkeit zu gewährleisten, müssen wir dem Konstruktoraufruf in der Klasse Triebwerk die Referenz auf das Flugzeug-Objekt übergeben, dem das Triebwerk zugeordnet ist. Diese wird im privaten Feld Flugzeug der Klasse Triebwerk gespeichert. Ferner ist in der überarbeiteten Klasse die Methode TriebwerkStarten definiert, aus der heraus zu Demonstrationszwecken die Methode Starten des Flugzeugobjekts aufgerufen wird.

Sehen wir uns nun die Klassendefinition von Flugzeug an, die sich auf das Wesentliche beschränkt. Damit wir uns später im Testcode vom Erfolg überzeugen können, wird ein Flugzeug durch einen Namen beschrieben, der dem Konstruktor der Klasse Flugzeug bei der Instanziierung übergeben wird. Außerdem wird die Eigenschaft Motor mit der Rückgabe der Referenz auf das Triebwerksobjekt angeboten, über die ein Benutzer Zugriff auf die Methoden des Triebwerks hat.


Public Class Flugzeug
Private trmotor As Triebwerk
Private name As String
' Konstruktor
Public Sub New(ByVal bezeichnung As String)
trmotor = New Triebwerk(Me)
Me.name = bezeichnung
End Sub
' Eigenschaft, welche die Referenz auf das interne
' Triebwerksobjekt liefert
Public ReadOnly Property Motor() As Triebwerk
Get
Return Me.trmotor
End Get
End Property
Public Sub Starten()
Console.WriteLine("Das Flugzeug {0} startet", Me.name)
End Sub
' ------------ innere Klasse Triebwerk ---------------
Public Class Triebwerk
Private flugzeug As Flugzeug
' Konstruktor
Public Sub New(ByVal flg As Flugzeug)
Me.flugzeug = flg
Me.flugzeug.trmotor = Me
End Sub
Public Sub TriebwerkStarten()
Console.WriteLine("Das Triebwerk wird gestartet")
flugzeug.Starten()
End Sub
End Class
End Class

Wir können nun die Klasse Flugzeug instanziieren und auf dessen Referenz die Eigenschaft Motor aufrufen, die ihrerseits die Referenz auf das dem Flugzeug zugeordnete Triebwerk liefert. Damit können wir das Triebwerk starten:


Dim flg As Flugzeug = New Flugzeug("Piper")
flg.Motor.TriebwerkStarten()

An der Konsole erhalten wir daraufhin die Ausgabe:


Das Triebwerk wird gestartet
Das Flugzeug Piper startet

Wir haben auch die Möglichkeit, die innere Klasse Triebwerk zu instanziieren. Dabei müssen wir dem Konstruktor die Referenz auf ein konkretes Flugzeug-Objekt übergeben:


Dim flg As Flugzeug = New Flugzeug("Piper")
Dim trb As Flugzeug.Triebwerk = New Flugzeug.Triebwerk(flg)

Grundsätzlich birgt dieser Aufruf die Gefahr der Inkonsistenz, denn wir erzeugen ein neues Triebwerk auf Basis des konkreten Flugzeugs flg. Dieses Flugzeugobjekt ist aber bereits im Besitz eines Triebwerks, das im Konstruktor erzeugt worden ist und dessen Referenz im Feld trmotor vorgehalten wird. Wir müssen dem Flugzeugobjekt mitteilen, dass das erste Triebwerk »ausgetauscht« und durch ein neues ersetzt wird. Um dem Flugzeug die Existenz des neuen Triebwerks mitzuteilen, enthält der Konstruktor der Klasse Triebwerk die Anweisung:


Me.flugzeug.trmotor = Me

Nun ist der Kreis vollständig geschlossen. Jedes Triebwerk ist unzweifelhaft einem bestimmten Flugzeug zugeordnet, und jedes Flugzeug hat auch nur ein bestimmtes Triebwerk.

Die Zugriffsmodifizierer einer inneren Klasse

Wie Sie oben gesehen haben, unterscheidet sich eine öffentlich (Public oder Friend) deklarierte innere Klasse nicht wesentlich von einer separaten Klassendefinition. Ein Benutzer »sieht« die innere Klasse und kann sie instanziieren. Das Konzept der verschachtelten Klassen, nämlich die konkrete Zugehörigkeit zu einem Objekt der umschließenden Klasse, wird aufgeweicht.

Ganz anders verhält sich eine Private deklarierte innere Klasse. Die Sichtbarkeit ist nur auf das umschließende äußere Objekt begrenzt, die Bindung ist eindeutig und kann nicht aufgebrochen werden. Erst jetzt kann der Verbund zwischen dem vom Aufrufer erkennbaren Objekt und seinem zugeordneten Teilobjekt die konzeptuellen Stärken voll ausspielen.

Ist die umschließende äußere Klasse nicht NotInheritable definiert, kann sie abgeleitet werden. Normalerweise dürfte die ableitende Klasse gleichermaßen Interesse an einem Objekt der eingebetteten Klasse haben. Weil sich Private deklarierte Komponenten jedoch der Sichtbarkeit der ableitenden Klasse entziehen, sollte die eingebettete Klasse in einer ableitbaren äußeren immer Friend deklariert sein.

 <<   zurück
  
  Zum Katalog
Zum Katalog: Visual Basic 2005
Visual Basic 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2005






 Visual C# 2005


Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Das Programmierhandbuch SQL Server 2005






 Das Programmier-
 handbuch
 SQL Server 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de